home *** CD-ROM | disk | FTP | other *** search
/ Resource for Source: C/C++ / Resource for Source - C-C++.iso / misc_src / knowhow4 / event.h < prev    next >
Text File  |  1995-11-01  |  9KB  |  250 lines

  1. #ifndef __EVENT
  2. #define __EVENT
  3.  
  4. #include <mouse.h>
  5.  
  6. // if normal key - ASCII code, if extended - 257 + low code
  7.  
  8. enum keys { EVENT_NO=0,
  9.     EVENT_ESC = 257,        EVENT_TAB,          EVENT_BKSP,
  10.     EVENT_BELL,             EVENT_RETURN,
  11.  
  12.     EVENT_LEFT,             EVENT_RIGHT,        EVENT_HOME,
  13.     EVENT_UP,
  14.     EVENT_PG_UP,            EVENT_FIVE,         // center of num. kbd
  15.     EVENT_END,              EVENT_DN,           EVENT_PG_DN,
  16.     EVENT_CTRL_HOME,        EVENT_CTRL_PG_UP,   EVENT_CTRL_END,
  17.     EVENT_CTRL_PG_DN,       EVENT_F1,           EVENT_F2,
  18.     EVENT_F3,               EVENT_F4,           EVENT_F5,
  19.     EVENT_F6,               EVENT_F7,           EVENT_F8,
  20.     EVENT_F9,               EVENT_F10,          EVENT_SHIFT_F1,
  21.     EVENT_SHIFT_F2,         EVENT_SHIFT_F3,     EVENT_SHIFT_F4,
  22.     EVENT_SHIFT_F5,         EVENT_SHIFT_F6,     EVENT_SHIFT_F7,
  23.     EVENT_SHIFT_F8,         EVENT_SHIFT_F9,     EVENT_SHIFT_F10,
  24.     EVENT_CTRL_F1,          EVENT_CTRL_F2,      EVENT_CTRL_F3,
  25.     EVENT_CTRL_F4,          EVENT_CTRL_F5,      EVENT_CTRL_F6,
  26.     EVENT_CTRL_F7,          EVENT_CTRL_F8,      EVENT_CTRL_F9,
  27.     EVENT_CTRL_F10,         EVENT_ALT_F1,       EVENT_ALT_F2,
  28.     EVENT_ALT_F3,           EVENT_ALT_F4,       EVENT_ALT_F5,
  29.     EVENT_ALT_F6,           EVENT_ALT_F7,       EVENT_ALT_F8,
  30.     EVENT_ALT_F9,           EVENT_ALT_F10,      EVENT_ALT_A,
  31.     EVENT_ALT_B,            EVENT_ALT_C,        EVENT_ALT_D,
  32.     EVENT_ALT_E,            EVENT_ALT_F,        EVENT_ALT_G,
  33.     EVENT_ALT_H,            EVENT_ALT_I,        EVENT_ALT_J,
  34.     EVENT_ALT_K,            EVENT_ALT_L,        EVENT_ALT_M,
  35.     EVENT_ALT_N,            EVENT_ALT_O,        EVENT_ALT_P,
  36.     EVENT_ALT_Q,            EVENT_ALT_R,        EVENT_ALT_S,
  37.     EVENT_ALT_T,            EVENT_ALT_U,        EVENT_ALT_V,
  38.     EVENT_ALT_W,            EVENT_ALT_X,        EVENT_ALT_Y,
  39.     EVENT_ALT_Z,
  40.  
  41.     EVENT_ALT_1,            EVENT_ALT_2,        EVENT_ALT_3,
  42.     EVENT_ALT_4,            EVENT_ALT_5,        EVENT_ALT_6,
  43.     EVENT_ALT_7,            EVENT_ALT_8,        EVENT_ALT_9,
  44.     EVENT_ALT_0,            EVENT_ALT_MINUS,    EVENT_ALT_EQUAL,
  45.     EVENT_ALT_TAB,
  46.     EVENT_INS,              EVENT_DEL,          EVENT_SHIFT_TAB,
  47.     EVENT_CTRL_Y,
  48.  
  49.     EVENT_CTRL_PRT_SCR,     EVENT_CTRL_BREAK
  50.     };
  51.  
  52.  
  53.  
  54.  /*
  55.  
  56.    word at 0:417h
  57.  
  58.           f  e  d   c  b  a  9  8  7  6  5  4  3  2  1  0
  59.          ┌──┬──┬──┬──┬──┬──┬──┬──╥──┬──┬──┬──┬──┬──┬──┬──┐
  60.          │ i│ c│ n│ s│ _│ _│aL│cL║I │C │N │S │a │c │sL│sR│
  61.          └┬─┴─┬┴─┬┴─┬┴──┴──┴─┬┴─┬╨─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┘
  62.     ┌─────────┘   │  │  │        │  │  │  │  │  │  └┐ │  │  └──────┐
  63.     │   ┌─────────┘  │  │        │  │ ┌┘  │  └┐ │   │ │  └─────┐   │
  64.     │   │   ┌────────┘  │    ┌───┘  │ │   │   │ └─┐ │ └────┐   │   │
  65.     │   │   │   ┌───────┘    │   ┌──┘ │   │   │   │ └──┐   │   │   │
  66.    ┌┴┐ ┌┴┐ ┌┴┐ ┌┴┐          ┌┴┐ ┌┴┐  ┌┴┐ ┌┴┐ ┌┴┐ ┌┴┐  ┌┴┐ ┌┴┐ ┌┴┐ ┌┴┐
  67.   ┌─┬─┬─┬─┬─┬─┬─┬─┐┌─┬─┬─┬─┬─┬─┬─┬─┐┌─┬─┬─┬─┬─┬─┬─┬─┐┌─┬─┬─┬─┬─┬─┬─┬─┐
  68.   │ │ │ │ │ │ │ │ ││ │ │ │ │ │ │ │ ││ │ │ │ │ │ │ │ ││ │ │ │ │ │ │ │ │
  69.   └─┴─┴─┴─┴─┴─┴─┴─┘└─┴─┴─┴─┴─┴─┴─┴─┘└─┴─┴─┴─┴─┴─┴─┴─┘└─┴─┴─┴─┴─┴─┴─┴─┘
  70.             . .        - + - + - + - +         
  71.             └┬┘ └┬┘ └──┬──┘
  72.             a│c  │     └───────────────  if 101-key
  73.              │   └─────────────────────  Del key up & Down ( emul)
  74.  keyshiftchange      └─────────────────────────  Right key(alt or control) changed
  75.  
  76.  */
  77.  
  78.  
  79.  // Defines for keyboard shift state Change
  80.  //  naming:
  81.  //  KC + [lt,rt] + {Shift,Ctrl,Alt,Scroll,Num,Caps,Ins,Del} + {Dn,Up}
  82.  //    or
  83.  //  KC +  {Scroll,Num,Caps,Ins} + {On,Off}
  84.  //  ===========================================================
  85.  //  examples
  86.  //
  87.  //   testing for right Alt or Ctrl key  events:
  88.  // ■  if( (key_shift_change & KCrtCtrlDn) == KCrtCtrlDn ) ....
  89.  //
  90.  //    for  other events  simply use
  91.  //
  92.  // ■  if( key_shift_change &  KCShiftUp) .....
  93.  //
  94.  //    Usage of  101-keyboard-specific keys is not encouraged !
  95.  //
  96. #define KCltShiftDn               0x00000001L
  97. #define KCltShiftUp               0x00000002L
  98. #define KCrtShiftDn               0x00000004L
  99. #define KCrtShiftUp               0x00000008L
  100. #define KCShiftDn                 0x00000005L
  101. #define KCShiftUp                 0x0000000aL
  102. #define KCCtrlDn                  0x00000010L
  103. #define KCCtrlUp                  0x00000020L
  104. #define KCAltDn                   0x00000040L
  105. #define KCAltUp                   0x00000080L
  106. #define KCScrollOn                0x00000100L
  107. #define KCScrollOff               0x00000200L
  108. #define KCNumOn                   0x00000400L
  109. #define KCNumOff                  0x00000800L
  110. #define KCCapsOn                  0x00001000L
  111. #define KCCapsOff                 0x00002000L
  112. #define KCInsOn                   0x00004000L
  113. #define KCInsOff                  0x00008000L
  114. #define KCltCtrlDn                0x00010000L
  115. #define KCltCtrlUp                0x00020000L
  116. #define KCltAltDn                 0x00040000L
  117. #define KCltAltUp                 0x00080000L
  118. #define KCDelDn                   0x00100000L
  119. #define KCDelUp                   0x00200000L
  120. #define  KCrtCtrl                  0x00400000L  //  do not use
  121. #define  KCrtAlt                   0x00800000L  //  do not use
  122. #define KCrtCtrlDn                0x00400010L
  123. #define KCrtCtrlUp                0x00400020L
  124. #define KCrtAltDn                 0x00800040L
  125. #define KCrtAltUp                 0x00800080L
  126. #define KCScrollDn                0x01000000L
  127. #define KCScrollUp                0x02000000L
  128. #define KCNumDn                   0x04000000L
  129. #define KCNumUp                   0x08000000L
  130. #define KCCapsDn                  0x10000000L
  131. #define KCCapsUp                  0x20000000L
  132. #define KCInsDn                   0x40000000L
  133. #define KCInsUp                   0x80000000L
  134.  
  135.  
  136. enum  mouse_change
  137.       { // mouse state change
  138.     // naming :
  139.     // MC + {left,center,right} + {Dn,Up,2}
  140.     // MCmove
  141.  
  142.        MCmove=0x1,
  143.        MCleftDn=0x02,MCleftUp=0x04,
  144.        MCrightDn=0x08,MCRightUp=0x10,
  145.        MCcenterDn=0x20,MCcenterUp=0x40,
  146.  
  147.  
  148.        MCleft2=0x100,MCright2=0x200,MCcenter2=0x400,  // double-clicks
  149.  
  150.        MCnone=0x00,MC1=0x7e,MC2=0x700,MCall=0x77f
  151.        };
  152.  
  153. #define MCmiddleDn MCcenterDn     // Synonyms
  154. #define MCmiddleUp MCcenterUp
  155. #define MCmiddle2  MCcenter2
  156.  
  157.  
  158.  
  159.  
  160.  
  161. #define KEYEVENT      1
  162. #define SHIFTKEYEVENT 2     // f.e. press SHIFT
  163. #define MOUSEEVENT    4
  164. #define NOEVENT       0
  165.  
  166.  
  167.  
  168.  
  169. typedef   unsigned long shiftkeychangetype;
  170.  
  171.  
  172. struct event
  173.      {
  174.      char what;  //KEYEVENT | SHIFTKEYEVENT | MOUSEEVENT | NOEVENT
  175.      char Delpressed;  // placed here for efficiency; logically  it
  176.                // should come later
  177.  
  178.      union
  179.      {
  180.      int key;
  181.      int mousechange;
  182.      shiftkeychangetype kbchange;
  183.      };
  184.      mousestatus msstatus;
  185.      unsigned kbstatus;
  186.        //******************
  187.       operator char() const
  188.         { return what==KEYEVENT ? (key<256 ? key: 0):0;}
  189.       int operator ! () const {return what==NOEVENT;}
  190.       operator int() const {return what!=NOEVENT;}
  191.  
  192.       int mouse1() const {if(what!=MOUSEEVENT) return 0;  // single clicks
  193.             return mousechange & MC1;}
  194.       int mouse2() const {if(what!=MOUSEEVENT) return 0; // double clicks
  195.             return mousechange & MC2;}
  196.       int keypress() const {if(what!=KEYEVENT) return 0; // keys enum
  197.             return key;}
  198.       shiftkeychangetype shiftkey() const
  199.             {if(what!=SHIFTKEYEVENT) return 0; // double clicks
  200.             return kbchange;}
  201.  
  202.       loc where() const {return msstatus.where();}
  203.  
  204.       int is_char() { return char(*this); }
  205.       int is_control()
  206.           { return (what == KEYEVENT )
  207.                     && !  char(*this); }
  208.       };
  209.  
  210.  
  211.  
  212.  
  213.  
  214.  
  215. class EventDriver   //
  216.     {
  217.       static void far * oldkbhandler;
  218.       static unsigned char break_code;
  219.       static volatile char Delispressed;
  220.     protected:
  221.       static unsigned oldkbstatus;
  222.       static mousestatus oldmsstatus;
  223.       static char olddelpressed;
  224.  
  225.       static void far interrupt kbhandler();
  226.     public:
  227.  
  228.     EventDriver();
  229.     ~EventDriver();
  230.  
  231.     friend event getevent ( int ,int);
  232.     friend event readevent( int ); // Don't wait !
  233.     friend int eventavail ( int, int);
  234.  
  235.  
  236.     };
  237.  
  238.  //
  239.  //  for parameter 'mask' OR following: KEYEVENT SHIFTKEYEVENT MOUSEEVENT
  240.  //  for parameter 'mousemask' OR mouse_change (MCxxxx) constants
  241.  //
  242.     event getevent ( int mask =-1,int mousemask=MC1);  // wait
  243. // default mousemask value: consider only button presses/releases
  244.     event readevent(int mask =-1 ); // Don't wait !
  245.     int eventavail (int mask =-1,int mousemask=MC1);
  246.  
  247.     int  keyboard101(); //Check for 101-keyboard present
  248.  
  249. #endif __EVENT
  250.